#include "gpio/gpio_api.h"


#if (DEVICE_DEBUG > DEVICE_DEBUG_OFF)
static const char *TAG = "GPIO_API";
#endif

DEVICE_PUBLIC(gpio_device_t *) gpio_device_find(const char *name) {
    if (!name) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_find error");
        return NULL;
    }
    return device_find(name);
}

DEVICE_PUBLIC(int) gpio_device_init(gpio_device_t *dev, gpio_device_config_t *dev_cfg) {
    if (!dev || !dev_cfg) {
        DEVICE_LOG_ERROR(TAG, "gpio device init param error");
        return -1;
    }
    return device_open(dev, dev_cfg);
}

DEVICE_PUBLIC(int) gpio_device_deinit(gpio_device_t *dev) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio device deinit param error");
    }
    return device_close(dev);
}

DEVICE_PUBLIC(int) gpio_device_set_level(gpio_device_t *dev, gpio_device_pin_level_t level) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_set_level param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_SET_LEVEL, level);
}

DEVICE_PUBLIC(int) gpio_device_get_level(gpio_device_t *dev) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_get_level param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_GET_LEVEL);
}


DEVICE_PUBLIC(int) gpio_device_interrupt_enable(gpio_device_t *dev) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_interrupt_enable param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_INTR_ENABLE);
}

DEVICE_PUBLIC(int) gpio_device_interrupt_disable(gpio_device_t *dev) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_interrupt_disable param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_INTR_DISABLE);
}

DEVICE_PUBLIC(int) gpio_device_set_interrupt_type(gpio_device_t *dev, gpio_device_intr_type_t type) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_set_interrupt_type param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_SET_INTR_MODE, type);
}

DEVICE_PUBLIC(int) gpio_device_isr_cb_add(gpio_device_t *dev, gpio_isr_cb isr_cb, void *args) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_isr_cb_add param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_ISRCB_ADD, isr_cb, args);
}

DEVICE_PUBLIC(int) gpio_device_isr_cb_remove(gpio_device_t *dev) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_isr_cb_remove param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_ISRCB_REMOVE);
}


DEVICE_PUBLIC(int) gpio_device_lowpower_enter(gpio_device_t *dev) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_lowpower_enter param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_SET_LOWPOWER_ENTER);
}

DEVICE_PUBLIC(int) gpio_device_lowpower_exit(gpio_device_t *dev) {
    if (!dev) {
        DEVICE_LOG_ERROR(TAG, "gpio_device_lowpower_enter param error");
        return -1;
    }
    return device_ioctl(dev, GPIO_CTRL_CMD_SET_LOWPOWER_EXIT);
}
